#include <my_head.h>

int main(int argc, const char *argv[]){
    int fd1 = open("fifo1", O_RDONLY);
    int fd2 = open("fifo2", O_RDONLY);
    int fd3 = open("fifo3", O_RDONLY);

    // 创建要监视的集合
    fd_set readfds; // 母本
    FD_ZERO(&readfds); // 清空集合
    fd_set readfds_temp; // 副本 用来给select 擦除用的
    FD_ZERO(&readfds_temp); // 清空集合

    int max_fd = 0; // 用来保存已经监视的最大的文件描述符
    // 将文件描述符添加到集合中
    FD_SET(fd1, &readfds);
    max_fd = fd1 > max_fd ? fd1 : max_fd; // 更新最大文件描述符
    FD_SET(fd2, &readfds);
    max_fd = fd2 > max_fd ? fd2 : max_fd; // 更新最大文件描述符
    FD_SET(fd3, &readfds);
    max_fd = fd3 > max_fd ? fd3 : max_fd; // 更新最大文件描述符

    char buff[128] = {0};
    int ready_count = 0; // 就绪的文件描述符的个数
    while(1){
        // select每次退出时 会将没有就绪的文件描述符在集合中删除
        // 所以如果在循环中使用select 每次需要重置集合
        readfds_temp = readfds;
        // 执行select
        if(-1 == (ready_count = select(max_fd+1, &readfds_temp, NULL, NULL, NULL)))
            ERR_LOG("select error");
        // 判断谁就绪了 谁就绪了就处理谁
        for(int i = 3; i < max_fd+1 && ready_count!=0; i++){
            if(FD_ISSET(i, &readfds_temp)){
                memset(buff, 0, sizeof(buff));
                read(i, buff, sizeof(buff));
                printf("buff=[%s]\n", buff);
                ready_count--; // 此处是为了减少遍历的次数 提高效率的
            }
        }
    }

    close(fd1);
    close(fd2);
    close(fd3);

    return 0;
}